Notes#

Hide imports
import os

import dimcat as dc
import ms3
import pandas as pd
import plotly.express as px
from dimcat import filters, plotting

import utils

pd.set_option("display.max_rows", 1000)
pd.set_option("display.max_columns", 500)
Hide source
RESULTS_PATH = os.path.abspath(os.path.join(utils.OUTPUT_FOLDER, "notes_stats"))
os.makedirs(RESULTS_PATH, exist_ok=True)


def make_output_path(
    filename: str,
    extension=None,
    path=RESULTS_PATH,
) -> str:
    return utils.make_output_path(filename=filename, extension=extension, path=path)


def save_figure_as(
    fig, filename, formats=("png", "pdf"), directory=RESULTS_PATH, **kwargs
):
    if formats is not None:
        for fmt in formats:
            plotting.write_image(fig, filename, directory, format=fmt, **kwargs)
    else:
        plotting.write_image(fig, filename, directory, **kwargs)

Loading data

Hide source
D = utils.get_dataset("c_schumann_lieder", corpus_release="v2.4")
package = D.inputs.get_package()
package_info = package._package.custom
git_tag = package_info.get("git_tag")
utils.print_heading("Data and software versions")
print("Clara Schumann – Lieder version v2.4")
print(f"Datapackage '{package.package_name}' @ {git_tag}")
print(f"dimcat version {dc.__version__}\n")
D
Data and software versions
--------------------------

Clara Schumann – Lieder version v2.4
Datapackage 'c_schumann_lieder' @ v2.4
dimcat version 3.4.0
Dataset
=======
{'inputs': {'basepath': None,
            'packages': {'c_schumann_lieder': ["'c_schumann_lieder.measures' (MuseScoreFacetName.MuseScoreMeasures)",
                                               "'c_schumann_lieder.notes' (MuseScoreFacetName.MuseScoreNotes)",
                                               "'c_schumann_lieder.expanded' (MuseScoreFacetName.MuseScoreHarmonies)",
                                               "'c_schumann_lieder.chords' (MuseScoreFacetName.MuseScoreChords)",
                                               "'c_schumann_lieder.metadata' (FeatureName.Metadata)"]}},
 'outputs': {'basepath': None, 'packages': {}},
 'pipeline': []}

Metadata#

filtered_D = filters.HasHarmonyLabelsFilter(keep_values=[True]).process(D)

all_metadata = filtered_D.get_metadata()
all_metadata.reset_index(level=1).groupby(level=0).nth(0).iloc[:, :20]
piece TimeSig KeySig last_mc last_mn length_qb last_mc_unfolded last_mn_unfolded length_qb_unfolded volta_mcs all_notes_qb n_onsets n_onset_positions guitar_chord_count form_label_count label_count annotated_key harmony_version annotators reviewers
corpus
c_schumann_lieder op13no1 Ich stand in dunklen Traumen {1: '3/4'} {1: -3} 37 37 111.0 37 37 111.0 () 552.5 931 225 0 0 103 Eb 2.3.0 Adrian Nagel AB
chronological_order = utils.chronological_corpus_order(all_metadata)
corpus_colors = dict(zip(chronological_order, utils.CORPUS_COLOR_SCALE))
notes_feature = filtered_D.get_feature("notes")
all_notes = notes_feature.df
print(f"{len(all_notes.index)} notes over {len(all_notes.groupby(level=[0,1]))} files.")
all_notes.head()
10418 notes over 12 files.
mc mn quarterbeats quarterbeats_all_endings duration_qb duration mc_onset mn_onset timesig staff voice volta chord_id gracenote midi name nominal_duration octave scalar tied tremolo tpc_name tpc
corpus piece i
c_schumann_lieder op13no1 Ich stand in dunklen Traumen 0 1 1 0 0 0.5 1/8 0 0 3/4 3 1 <NA> 6 <NA> 51 Eb3 1/8 3 1 <NA> <NA> Eb -3
1 1 1 0 0 0.5 1/8 0 0 3/4 2 1 <NA> 0 <NA> 58 Bb3 1/8 3 1 <NA> <NA> Bb -2
2 1 1 0 0 0.5 1/8 0 0 3/4 2 1 <NA> 0 <NA> 63 Eb4 1/8 4 1 <NA> <NA> Eb -3
3 1 1 0 0 0.5 1/8 0 0 3/4 2 1 <NA> 0 <NA> 67 G4 1/8 4 1 <NA> <NA> G 1
4 1 1 1/2 1/2 0.5 1/8 1/8 1/8 3/4 3 1 <NA> 7 <NA> 51 Eb3 1/8 3 1 <NA> <NA> Eb -3
def weight_notes(nl, group_col="midi", precise=True):
    summed_durations = nl.groupby(group_col).duration_qb.sum()
    shortest_duration = summed_durations[summed_durations > 0].min()
    summed_durations /= shortest_duration  # normalize such that the shortest duration results in 1 occurrence
    if not precise:
        # This simple trick reduces compute time but also precision:
        # The rationale is to have the smallest value be slightly larger than 0.5 because
        # if it was exactly 0.5 it would be rounded down by repeat_notes_according_to_weights()
        summed_durations /= 1.9999999
    return repeat_notes_according_to_weights(summed_durations)


def repeat_notes_according_to_weights(weights):
    try:
        counts = weights.round().astype(int)
    except Exception:
        return pd.Series(dtype=int)
    counts_reflecting_weights = []
    for pitch, count in counts.items():
        counts_reflecting_weights.extend([pitch] * count)
    return pd.Series(counts_reflecting_weights)

Ambitus#

corpus_names = {
    corp: utils.get_corpus_display_name(corp) for corp in chronological_order
}
chronological_corpus_names = list(corpus_names.values())
corpus_name_colors = {
    corpus_names[corp]: color for corp, color in corpus_colors.items()
}
all_notes["corpus_name"] = all_notes.index.get_level_values(0).map(corpus_names)
grouped_notes = all_notes.groupby("corpus_name")
weighted_midi = pd.concat(
    [weight_notes(nl, "midi", precise=False) for _, nl in grouped_notes],
    keys=grouped_notes.groups.keys(),
).reset_index(level=0)
weighted_midi.columns = ["dataset", "midi"]
weighted_midi
dataset midi
0 C Schumann Lieder 27
1 C Schumann Lieder 27
2 C Schumann Lieder 27
3 C Schumann Lieder 27
4 C Schumann Lieder 27
... ... ...
5939 C Schumann Lieder 87
5940 C Schumann Lieder 87
5941 C Schumann Lieder 88
5942 C Schumann Lieder 89
5943 C Schumann Lieder 89

5944 rows × 2 columns

# fig = px.violin(weighted_midi,
#                 x='dataset',
#                 y='midi',
#                 color='dataset',
#                 title="Corpus-wise distribution over registers (ambitus)",
#                 box=True,
#                 labels=dict(
#                     dataset='',
#                     midi='distribution of pitches by duration'
#                 ),
#                 category_orders=dict(dataset=chronological_corpus_names),
#                 color_discrete_map=corpus_name_colors,
#                 width=1000, height=600,
#                )
# fig.update_traces(spanmode='hard') # do not extend beyond outliers
# fig.update_layout(**utils.STD_LAYOUT,
#                  showlegend=False)
# fig.update_yaxes(
#     tickmode= 'array',
#     tickvals= [12, 24, 36, 48, 60, 72, 84, 96],
#     ticktext = ["C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7"],
# )
# fig.update_xaxes(tickangle=45)
# save_figure_as(fig, "ambitus_corpuswise_violins")
# fig.show()

Tonal Pitch Classes (TPC)#

weighted_tpc = pd.concat(
    [weight_notes(nl, "tpc") for _, nl in grouped_notes],
    keys=grouped_notes.groups.keys(),
).reset_index(level=0)
weighted_tpc.columns = ["dataset", "tpc"]
weighted_tpc
dataset tpc
0 C Schumann Lieder -9
1 C Schumann Lieder -9
2 C Schumann Lieder -8
3 C Schumann Lieder -8
4 C Schumann Lieder -8
5 C Schumann Lieder -7
6 C Schumann Lieder -7
7 C Schumann Lieder -7
8 C Schumann Lieder -7
9 C Schumann Lieder -7
10 C Schumann Lieder -7
11 C Schumann Lieder -6
12 C Schumann Lieder -6
13 C Schumann Lieder -6
14 C Schumann Lieder -6
15 C Schumann Lieder -6
16 C Schumann Lieder -6
17 C Schumann Lieder -6
18 C Schumann Lieder -6
19 C Schumann Lieder -6
20 C Schumann Lieder -6
21 C Schumann Lieder -6
22 C Schumann Lieder -6
23 C Schumann Lieder -6
24 C Schumann Lieder -5
25 C Schumann Lieder -5
26 C Schumann Lieder -5
27 C Schumann Lieder -5
28 C Schumann Lieder -5
29 C Schumann Lieder -5
30 C Schumann Lieder -5
31 C Schumann Lieder -5
32 C Schumann Lieder -5
33 C Schumann Lieder -5
34 C Schumann Lieder -5
35 C Schumann Lieder -5
36 C Schumann Lieder -5
37 C Schumann Lieder -5
38 C Schumann Lieder -5
39 C Schumann Lieder -5
40 C Schumann Lieder -5
41 C Schumann Lieder -5
42 C Schumann Lieder -5
43 C Schumann Lieder -5
44 C Schumann Lieder -5
45 C Schumann Lieder -5
46 C Schumann Lieder -5
47 C Schumann Lieder -5
48 C Schumann Lieder -5
49 C Schumann Lieder -5
50 C Schumann Lieder -5
51 C Schumann Lieder -5
52 C Schumann Lieder -5
53 C Schumann Lieder -5
54 C Schumann Lieder -5
55 C Schumann Lieder -5
56 C Schumann Lieder -5
57 C Schumann Lieder -5
58 C Schumann Lieder -4
59 C Schumann Lieder -4
60 C Schumann Lieder -4
61 C Schumann Lieder -4
62 C Schumann Lieder -4
63 C Schumann Lieder -4
64 C Schumann Lieder -4
65 C Schumann Lieder -4
66 C Schumann Lieder -4
67 C Schumann Lieder -4
68 C Schumann Lieder -4
69 C Schumann Lieder -4
70 C Schumann Lieder -4
71 C Schumann Lieder -4
72 C Schumann Lieder -4
73 C Schumann Lieder -4
74 C Schumann Lieder -4
75 C Schumann Lieder -4
76 C Schumann Lieder -4
77 C Schumann Lieder -4
78 C Schumann Lieder -4
79 C Schumann Lieder -4
80 C Schumann Lieder -4
81 C Schumann Lieder -4
82 C Schumann Lieder -4
83 C Schumann Lieder -4
84 C Schumann Lieder -4
85 C Schumann Lieder -4
86 C Schumann Lieder -4
87 C Schumann Lieder -4
88 C Schumann Lieder -4
89 C Schumann Lieder -4
90 C Schumann Lieder -4
91 C Schumann Lieder -4
92 C Schumann Lieder -4
93 C Schumann Lieder -4
94 C Schumann Lieder -4
95 C Schumann Lieder -4
96 C Schumann Lieder -4
97 C Schumann Lieder -4
98 C Schumann Lieder -4
99 C Schumann Lieder -4
100 C Schumann Lieder -4
101 C Schumann Lieder -4
102 C Schumann Lieder -4
103 C Schumann Lieder -4
104 C Schumann Lieder -4
105 C Schumann Lieder -4
106 C Schumann Lieder -4
107 C Schumann Lieder -4
108 C Schumann Lieder -4
109 C Schumann Lieder -4
110 C Schumann Lieder -4
111 C Schumann Lieder -4
112 C Schumann Lieder -4
113 C Schumann Lieder -4
114 C Schumann Lieder -4
115 C Schumann Lieder -4
116 C Schumann Lieder -4
117 C Schumann Lieder -4
118 C Schumann Lieder -4
119 C Schumann Lieder -4
120 C Schumann Lieder -3
121 C Schumann Lieder -3
122 C Schumann Lieder -3
123 C Schumann Lieder -3
124 C Schumann Lieder -3
125 C Schumann Lieder -3
126 C Schumann Lieder -3
127 C Schumann Lieder -3
128 C Schumann Lieder -3
129 C Schumann Lieder -3
130 C Schumann Lieder -3
131 C Schumann Lieder -3
132 C Schumann Lieder -3
133 C Schumann Lieder -3
134 C Schumann Lieder -3
135 C Schumann Lieder -3
136 C Schumann Lieder -3
137 C Schumann Lieder -3
138 C Schumann Lieder -3
139 C Schumann Lieder -3
140 C Schumann Lieder -3
141 C Schumann Lieder -3
142 C Schumann Lieder -3
143 C Schumann Lieder -3
144 C Schumann Lieder -3
145 C Schumann Lieder -3
146 C Schumann Lieder -3
147 C Schumann Lieder -3
148 C Schumann Lieder -3
149 C Schumann Lieder -3
150 C Schumann Lieder -3
151 C Schumann Lieder -3
152 C Schumann Lieder -3
153 C Schumann Lieder -3
154 C Schumann Lieder -3
155 C Schumann Lieder -3
156 C Schumann Lieder -3
157 C Schumann Lieder -3
158 C Schumann Lieder -3
159 C Schumann Lieder -3
160 C Schumann Lieder -3
161 C Schumann Lieder -3
162 C Schumann Lieder -3
163 C Schumann Lieder -3
164 C Schumann Lieder -3
165 C Schumann Lieder -3
166 C Schumann Lieder -3
167 C Schumann Lieder -3
168 C Schumann Lieder -3
169 C Schumann Lieder -3
170 C Schumann Lieder -3
171 C Schumann Lieder -3
172 C Schumann Lieder -3
173 C Schumann Lieder -3
174 C Schumann Lieder -3
175 C Schumann Lieder -3
176 C Schumann Lieder -3
177 C Schumann Lieder -3
178 C Schumann Lieder -3
179 C Schumann Lieder -3
180 C Schumann Lieder -3
181 C Schumann Lieder -3
182 C Schumann Lieder -3
183 C Schumann Lieder -3
184 C Schumann Lieder -3
185 C Schumann Lieder -3
186 C Schumann Lieder -3
187 C Schumann Lieder -3
188 C Schumann Lieder -3
189 C Schumann Lieder -3
190 C Schumann Lieder -3
191 C Schumann Lieder -3
192 C Schumann Lieder -3
193 C Schumann Lieder -3
194 C Schumann Lieder -3
195 C Schumann Lieder -3
196 C Schumann Lieder -3
197 C Schumann Lieder -3
198 C Schumann Lieder -3
199 C Schumann Lieder -3
200 C Schumann Lieder -3
201 C Schumann Lieder -3
202 C Schumann Lieder -3
203 C Schumann Lieder -3
204 C Schumann Lieder -3
205 C Schumann Lieder -3
206 C Schumann Lieder -3
207 C Schumann Lieder -3
208 C Schumann Lieder -3
209 C Schumann Lieder -3
210 C Schumann Lieder -3
211 C Schumann Lieder -3
212 C Schumann Lieder -3
213 C Schumann Lieder -3
214 C Schumann Lieder -3
215 C Schumann Lieder -3
216 C Schumann Lieder -2
217 C Schumann Lieder -2
218 C Schumann Lieder -2
219 C Schumann Lieder -2
220 C Schumann Lieder -2
221 C Schumann Lieder -2
222 C Schumann Lieder -2
223 C Schumann Lieder -2
224 C Schumann Lieder -2
225 C Schumann Lieder -2
226 C Schumann Lieder -2
227 C Schumann Lieder -2
228 C Schumann Lieder -2
229 C Schumann Lieder -2
230 C Schumann Lieder -2
231 C Schumann Lieder -2
232 C Schumann Lieder -2
233 C Schumann Lieder -2
234 C Schumann Lieder -2
235 C Schumann Lieder -2
236 C Schumann Lieder -2
237 C Schumann Lieder -2
238 C Schumann Lieder -2
239 C Schumann Lieder -2
240 C Schumann Lieder -2
241 C Schumann Lieder -2
242 C Schumann Lieder -2
243 C Schumann Lieder -2
244 C Schumann Lieder -2
245 C Schumann Lieder -2
246 C Schumann Lieder -2
247 C Schumann Lieder -2
248 C Schumann Lieder -2
249 C Schumann Lieder -2
250 C Schumann Lieder -2
251 C Schumann Lieder -2
252 C Schumann Lieder -2
253 C Schumann Lieder -2
254 C Schumann Lieder -2
255 C Schumann Lieder -2
256 C Schumann Lieder -2
257 C Schumann Lieder -2
258 C Schumann Lieder -2
259 C Schumann Lieder -2
260 C Schumann Lieder -2
261 C Schumann Lieder -2
262 C Schumann Lieder -2
263 C Schumann Lieder -2
264 C Schumann Lieder -2
265 C Schumann Lieder -2
266 C Schumann Lieder -2
267 C Schumann Lieder -2
268 C Schumann Lieder -2
269 C Schumann Lieder -2
270 C Schumann Lieder -2
271 C Schumann Lieder -2
272 C Schumann Lieder -2
273 C Schumann Lieder -2
274 C Schumann Lieder -2
275 C Schumann Lieder -2
276 C Schumann Lieder -2
277 C Schumann Lieder -2
278 C Schumann Lieder -2
279 C Schumann Lieder -2
280 C Schumann Lieder -2
281 C Schumann Lieder -2
282 C Schumann Lieder -2
283 C Schumann Lieder -2
284 C Schumann Lieder -2
285 C Schumann Lieder -2
286 C Schumann Lieder -2
287 C Schumann Lieder -2
288 C Schumann Lieder -2
289 C Schumann Lieder -2
290 C Schumann Lieder -2
291 C Schumann Lieder -2
292 C Schumann Lieder -2
293 C Schumann Lieder -2
294 C Schumann Lieder -2
295 C Schumann Lieder -2
296 C Schumann Lieder -2
297 C Schumann Lieder -2
298 C Schumann Lieder -2
299 C Schumann Lieder -2
300 C Schumann Lieder -2
301 C Schumann Lieder -1
302 C Schumann Lieder -1
303 C Schumann Lieder -1
304 C Schumann Lieder -1
305 C Schumann Lieder -1
306 C Schumann Lieder -1
307 C Schumann Lieder -1
308 C Schumann Lieder -1
309 C Schumann Lieder -1
310 C Schumann Lieder -1
311 C Schumann Lieder -1
312 C Schumann Lieder -1
313 C Schumann Lieder -1
314 C Schumann Lieder -1
315 C Schumann Lieder -1
316 C Schumann Lieder -1
317 C Schumann Lieder -1
318 C Schumann Lieder -1
319 C Schumann Lieder -1
320 C Schumann Lieder -1
321 C Schumann Lieder -1
322 C Schumann Lieder -1
323 C Schumann Lieder -1
324 C Schumann Lieder -1
325 C Schumann Lieder -1
326 C Schumann Lieder -1
327 C Schumann Lieder -1
328 C Schumann Lieder -1
329 C Schumann Lieder -1
330 C Schumann Lieder -1
331 C Schumann Lieder -1
332 C Schumann Lieder -1
333 C Schumann Lieder -1
334 C Schumann Lieder -1
335 C Schumann Lieder -1
336 C Schumann Lieder -1
337 C Schumann Lieder -1
338 C Schumann Lieder -1
339 C Schumann Lieder -1
340 C Schumann Lieder -1
341 C Schumann Lieder -1
342 C Schumann Lieder -1
343 C Schumann Lieder -1
344 C Schumann Lieder -1
345 C Schumann Lieder -1
346 C Schumann Lieder -1
347 C Schumann Lieder -1
348 C Schumann Lieder -1
349 C Schumann Lieder -1
350 C Schumann Lieder -1
351 C Schumann Lieder -1
352 C Schumann Lieder -1
353 C Schumann Lieder -1
354 C Schumann Lieder 0
355 C Schumann Lieder 0
356 C Schumann Lieder 0
357 C Schumann Lieder 0
358 C Schumann Lieder 0
359 C Schumann Lieder 0
360 C Schumann Lieder 0
361 C Schumann Lieder 0
362 C Schumann Lieder 0
363 C Schumann Lieder 0
364 C Schumann Lieder 0
365 C Schumann Lieder 0
366 C Schumann Lieder 0
367 C Schumann Lieder 0
368 C Schumann Lieder 0
369 C Schumann Lieder 0
370 C Schumann Lieder 0
371 C Schumann Lieder 0
372 C Schumann Lieder 0
373 C Schumann Lieder 0
374 C Schumann Lieder 0
375 C Schumann Lieder 0
376 C Schumann Lieder 0
377 C Schumann Lieder 0
378 C Schumann Lieder 0
379 C Schumann Lieder 0
380 C Schumann Lieder 0
381 C Schumann Lieder 0
382 C Schumann Lieder 0
383 C Schumann Lieder 0
384 C Schumann Lieder 0
385 C Schumann Lieder 0
386 C Schumann Lieder 0
387 C Schumann Lieder 0
388 C Schumann Lieder 0
389 C Schumann Lieder 0
390 C Schumann Lieder 0
391 C Schumann Lieder 0
392 C Schumann Lieder 0
393 C Schumann Lieder 0
394 C Schumann Lieder 0
395 C Schumann Lieder 0
396 C Schumann Lieder 0
397 C Schumann Lieder 0
398 C Schumann Lieder 0
399 C Schumann Lieder 0
400 C Schumann Lieder 0
401 C Schumann Lieder 0
402 C Schumann Lieder 0
403 C Schumann Lieder 0
404 C Schumann Lieder 0
405 C Schumann Lieder 0
406 C Schumann Lieder 0
407 C Schumann Lieder 0
408 C Schumann Lieder 0
409 C Schumann Lieder 0
410 C Schumann Lieder 0
411 C Schumann Lieder 0
412 C Schumann Lieder 0
413 C Schumann Lieder 0
414 C Schumann Lieder 0
415 C Schumann Lieder 0
416 C Schumann Lieder 0
417 C Schumann Lieder 0
418 C Schumann Lieder 1
419 C Schumann Lieder 1
420 C Schumann Lieder 1
421 C Schumann Lieder 1
422 C Schumann Lieder 1
423 C Schumann Lieder 1
424 C Schumann Lieder 1
425 C Schumann Lieder 1
426 C Schumann Lieder 1
427 C Schumann Lieder 1
428 C Schumann Lieder 1
429 C Schumann Lieder 1
430 C Schumann Lieder 1
431 C Schumann Lieder 1
432 C Schumann Lieder 1
433 C Schumann Lieder 1
434 C Schumann Lieder 1
435 C Schumann Lieder 1
436 C Schumann Lieder 1
437 C Schumann Lieder 1
438 C Schumann Lieder 1
439 C Schumann Lieder 1
440 C Schumann Lieder 1
441 C Schumann Lieder 1
442 C Schumann Lieder 1
443 C Schumann Lieder 1
444 C Schumann Lieder 1
445 C Schumann Lieder 1
446 C Schumann Lieder 1
447 C Schumann Lieder 1
448 C Schumann Lieder 1
449 C Schumann Lieder 1
450 C Schumann Lieder 1
451 C Schumann Lieder 1
452 C Schumann Lieder 1
453 C Schumann Lieder 1
454 C Schumann Lieder 1
455 C Schumann Lieder 1
456 C Schumann Lieder 1
457 C Schumann Lieder 1
458 C Schumann Lieder 1
459 C Schumann Lieder 1
460 C Schumann Lieder 1
461 C Schumann Lieder 1
462 C Schumann Lieder 1
463 C Schumann Lieder 1
464 C Schumann Lieder 1
465 C Schumann Lieder 1
466 C Schumann Lieder 1
467 C Schumann Lieder 1
468 C Schumann Lieder 1
469 C Schumann Lieder 1
470 C Schumann Lieder 1
471 C Schumann Lieder 1
472 C Schumann Lieder 1
473 C Schumann Lieder 1
474 C Schumann Lieder 1
475 C Schumann Lieder 1
476 C Schumann Lieder 1
477 C Schumann Lieder 1
478 C Schumann Lieder 1
479 C Schumann Lieder 1
480 C Schumann Lieder 2
481 C Schumann Lieder 2
482 C Schumann Lieder 2
483 C Schumann Lieder 2
484 C Schumann Lieder 2
485 C Schumann Lieder 2
486 C Schumann Lieder 2
487 C Schumann Lieder 2
488 C Schumann Lieder 2
489 C Schumann Lieder 2
490 C Schumann Lieder 2
491 C Schumann Lieder 2
492 C Schumann Lieder 2
493 C Schumann Lieder 2
494 C Schumann Lieder 2
495 C Schumann Lieder 2
496 C Schumann Lieder 2
497 C Schumann Lieder 2
498 C Schumann Lieder 2
499 C Schumann Lieder 2
500 C Schumann Lieder 2
501 C Schumann Lieder 2
502 C Schumann Lieder 2
503 C Schumann Lieder 2
504 C Schumann Lieder 2
505 C Schumann Lieder 2
506 C Schumann Lieder 2
507 C Schumann Lieder 2
508 C Schumann Lieder 2
509 C Schumann Lieder 2
510 C Schumann Lieder 2
511 C Schumann Lieder 2
512 C Schumann Lieder 2
513 C Schumann Lieder 2
514 C Schumann Lieder 2
515 C Schumann Lieder 2
516 C Schumann Lieder 2
517 C Schumann Lieder 2
518 C Schumann Lieder 2
519 C Schumann Lieder 2
520 C Schumann Lieder 2
521 C Schumann Lieder 2
522 C Schumann Lieder 2
523 C Schumann Lieder 2
524 C Schumann Lieder 2
525 C Schumann Lieder 2
526 C Schumann Lieder 2
527 C Schumann Lieder 2
528 C Schumann Lieder 2
529 C Schumann Lieder 2
530 C Schumann Lieder 2
531 C Schumann Lieder 2
532 C Schumann Lieder 2
533 C Schumann Lieder 2
534 C Schumann Lieder 2
535 C Schumann Lieder 2
536 C Schumann Lieder 2
537 C Schumann Lieder 2
538 C Schumann Lieder 2
539 C Schumann Lieder 2
540 C Schumann Lieder 2
541 C Schumann Lieder 2
542 C Schumann Lieder 3
543 C Schumann Lieder 3
544 C Schumann Lieder 3
545 C Schumann Lieder 3
546 C Schumann Lieder 3
547 C Schumann Lieder 3
548 C Schumann Lieder 3
549 C Schumann Lieder 3
550 C Schumann Lieder 3
551 C Schumann Lieder 3
552 C Schumann Lieder 3
553 C Schumann Lieder 3
554 C Schumann Lieder 3
555 C Schumann Lieder 3
556 C Schumann Lieder 3
557 C Schumann Lieder 3
558 C Schumann Lieder 3
559 C Schumann Lieder 3
560 C Schumann Lieder 3
561 C Schumann Lieder 3
562 C Schumann Lieder 3
563 C Schumann Lieder 3
564 C Schumann Lieder 3
565 C Schumann Lieder 3
566 C Schumann Lieder 3
567 C Schumann Lieder 3
568 C Schumann Lieder 3
569 C Schumann Lieder 3
570 C Schumann Lieder 3
571 C Schumann Lieder 3
572 C Schumann Lieder 3
573 C Schumann Lieder 3
574 C Schumann Lieder 3
575 C Schumann Lieder 3
576 C Schumann Lieder 3
577 C Schumann Lieder 3
578 C Schumann Lieder 3
579 C Schumann Lieder 3
580 C Schumann Lieder 3
581 C Schumann Lieder 3
582 C Schumann Lieder 3
583 C Schumann Lieder 3
584 C Schumann Lieder 3
585 C Schumann Lieder 3
586 C Schumann Lieder 3
587 C Schumann Lieder 3
588 C Schumann Lieder 3
589 C Schumann Lieder 3
590 C Schumann Lieder 3
591 C Schumann Lieder 3
592 C Schumann Lieder 4
593 C Schumann Lieder 4
594 C Schumann Lieder 4
595 C Schumann Lieder 4
596 C Schumann Lieder 4
597 C Schumann Lieder 4
598 C Schumann Lieder 4
599 C Schumann Lieder 4
600 C Schumann Lieder 4
601 C Schumann Lieder 4
602 C Schumann Lieder 4
603 C Schumann Lieder 4
604 C Schumann Lieder 4
605 C Schumann Lieder 4
606 C Schumann Lieder 4
607 C Schumann Lieder 4
608 C Schumann Lieder 4
609 C Schumann Lieder 4
610 C Schumann Lieder 4
611 C Schumann Lieder 4
612 C Schumann Lieder 4
613 C Schumann Lieder 4
614 C Schumann Lieder 4
615 C Schumann Lieder 4
616 C Schumann Lieder 4
617 C Schumann Lieder 4
618 C Schumann Lieder 4
619 C Schumann Lieder 4
620 C Schumann Lieder 4
621 C Schumann Lieder 4
622 C Schumann Lieder 4
623 C Schumann Lieder 5
624 C Schumann Lieder 5
625 C Schumann Lieder 5
626 C Schumann Lieder 5
627 C Schumann Lieder 5
628 C Schumann Lieder 5
629 C Schumann Lieder 5
630 C Schumann Lieder 5
631 C Schumann Lieder 5
632 C Schumann Lieder 5
633 C Schumann Lieder 5
634 C Schumann Lieder 5
635 C Schumann Lieder 5
636 C Schumann Lieder 5
637 C Schumann Lieder 5
638 C Schumann Lieder 5
639 C Schumann Lieder 5
640 C Schumann Lieder 5
641 C Schumann Lieder 5
642 C Schumann Lieder 5
643 C Schumann Lieder 5
644 C Schumann Lieder 5
645 C Schumann Lieder 5
646 C Schumann Lieder 5
647 C Schumann Lieder 5
648 C Schumann Lieder 5
649 C Schumann Lieder 5
650 C Schumann Lieder 6
651 C Schumann Lieder 6
652 C Schumann Lieder 6
653 C Schumann Lieder 6
654 C Schumann Lieder 6
655 C Schumann Lieder 6
656 C Schumann Lieder 6
657 C Schumann Lieder 6
658 C Schumann Lieder 6
659 C Schumann Lieder 6
660 C Schumann Lieder 6
661 C Schumann Lieder 6
662 C Schumann Lieder 6
663 C Schumann Lieder 6
664 C Schumann Lieder 6
665 C Schumann Lieder 6
666 C Schumann Lieder 6
667 C Schumann Lieder 6
668 C Schumann Lieder 6
669 C Schumann Lieder 6
670 C Schumann Lieder 6
671 C Schumann Lieder 6
672 C Schumann Lieder 6
673 C Schumann Lieder 7
674 C Schumann Lieder 7
675 C Schumann Lieder 7
676 C Schumann Lieder 7
677 C Schumann Lieder 7
678 C Schumann Lieder 7
679 C Schumann Lieder 7
680 C Schumann Lieder 7
681 C Schumann Lieder 7
682 C Schumann Lieder 7
683 C Schumann Lieder 7
684 C Schumann Lieder 7
685 C Schumann Lieder 8
686 C Schumann Lieder 8
687 C Schumann Lieder 8
688 C Schumann Lieder 8
689 C Schumann Lieder 8
690 C Schumann Lieder 8
691 C Schumann Lieder 8
692 C Schumann Lieder 8
693 C Schumann Lieder 8
694 C Schumann Lieder 9
695 C Schumann Lieder 9
696 C Schumann Lieder 9
697 C Schumann Lieder 10
698 C Schumann Lieder 11

As violin plot#

# fig = px.violin(weighted_tpc,
#                 x='dataset',
#                 y='tpc',
#                 color='dataset',
#                 title="Corpus-wise distribution over line of fifths (tonal pitch classes)",
#                 box=True,
#                 labels=dict(
#                     dataset='',
#                     tpc='distribution of tonal pitch classes by duration'
#                 ),
#                 category_orders=dict(dataset=chronological_corpus_names),
#                 color_discrete_map=corpus_name_colors,
#                 width=1000,
#                 height=600,
#                )
# fig.update_traces(spanmode='hard') # do not extend beyond outliers
# fig.update_layout(**utils.STD_LAYOUT,
#                  showlegend=False)
# fig.update_yaxes(
#     tickmode= 'array',
#     tickvals= [-12, -9, -6, -3, 0, 3, 6, 9, 12, 15, 18],
#     ticktext = ["Dbb", "Bbb", "Gb", "Eb", "C", "A", "F#", "D#", "B#", "G##", "E##"],
#     zerolinecolor='grey',
#     zeroline=True
# )
# fig.update_xaxes(tickangle=45)
# save_figure_as(fig, "pitch_class_distributions_corpuswise_violins")
# fig.show()
(all_notes)
mc mn quarterbeats quarterbeats_all_endings duration_qb duration mc_onset mn_onset timesig staff voice volta chord_id gracenote midi name nominal_duration octave scalar tied tremolo tpc_name tpc corpus_name
corpus piece i
c_schumann_lieder op13no1 Ich stand in dunklen Traumen 0 1 1 0 0 0.5 1/8 0 0 3/4 3 1 <NA> 6 <NA> 51 Eb3 1/8 3 1 <NA> <NA> Eb -3 C Schumann Lieder
1 1 1 0 0 0.5 1/8 0 0 3/4 2 1 <NA> 0 <NA> 58 Bb3 1/8 3 1 <NA> <NA> Bb -2 C Schumann Lieder
2 1 1 0 0 0.5 1/8 0 0 3/4 2 1 <NA> 0 <NA> 63 Eb4 1/8 4 1 <NA> <NA> Eb -3 C Schumann Lieder
3 1 1 0 0 0.5 1/8 0 0 3/4 2 1 <NA> 0 <NA> 67 G4 1/8 4 1 <NA> <NA> G 1 C Schumann Lieder
4 1 1 1/2 1/2 0.5 1/8 1/8 1/8 3/4 3 1 <NA> 7 <NA> 51 Eb3 1/8 3 1 <NA> <NA> Eb -3 C Schumann Lieder
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
op23no6 O Lust o Lust 690 40 40 117 117 1.5 3/8 0 0 6/8 2 1 <NA> 588 <NA> 65 F4 1/4 4 3/2 <NA> <NA> F -1 C Schumann Lieder
691 40 40 117 117 1.5 3/8 0 0 6/8 2 1 <NA> 588 <NA> 70 Bb4 1/4 4 3/2 <NA> <NA> Bb -2 C Schumann Lieder
692 40 40 237/2 237/2 0.5 1/8 3/8 3/8 6/8 3 1 <NA> 591 <NA> 39 Eb2 1/8 2 1 <NA> <NA> Eb -3 C Schumann Lieder
693 40 40 237/2 237/2 0.5 1/8 3/8 3/8 6/8 2 1 <NA> 589 <NA> 55 G3 1/8 3 1 <NA> <NA> G 1 C Schumann Lieder
694 40 40 237/2 237/2 0.5 1/8 3/8 3/8 6/8 2 1 <NA> 589 <NA> 63 Eb4 1/8 4 1 <NA> <NA> Eb -3 C Schumann Lieder

10418 rows × 24 columns

width = 1400
height = 800

weighted_pitch_values = pd.concat(
    [
        weighted_midi.rename(columns={"midi": "value"}),
        weighted_tpc.rename(columns={"tpc": "value"}),
    ],
    keys=["MIDI pitch", "Tonal pitch class"],
    names=["distribution"],
).reset_index(level=[0, 1])

fig = plotting.make_violin_plot(
    weighted_pitch_values,
    x_col="dataset",
    y_col="value",
    color="dataset",
    facet_row="distribution",
    box=True,
    labels=dict(dataset="", tpc="distribution of tonal pitch classes by duration"),
    category_orders=dict(dataset=chronological_corpus_names),
    # color_discrete_map=corpus_name_colors,
    color_discrete_sequence=px.colors.qualitative.Dark24,
    traces_settings=dict(
        spanmode="hard",
        width=1,
        # scalemode='width'
    ),
    layout=dict(
        showlegend=False,
        margin=dict(
            t=0,
            b=0,
            l=0,
            r=0,
        ),
    ),
    x_axis=dict(
        # tickangle=45,
        tickfont_size=15
    ),
    y_axis=dict(
        tickmode="array",
        tickvals=[-12, -9, -6, -3, 0, 3, 6, 9, 12, 15, 24, 36, 48, 60, 72, 84, 96],
        ticktext=[
            "Dbb",
            "Bbb",
            "Gb",
            "Eb",
            "C",
            "A",
            "F#",
            "D#",
            "B#",
            "G##",
            "C1",
            "C2",
            "C3",
            "C4",
            "C5",
            "C6",
            "C7",
        ],
        zerolinecolor="grey",
        zeroline=True,
    ),
    width=width,
    height=height,
)
utils.realign_subplot_axes(fig, y_axes=dict(title_text=""))
save_figure_as(fig, "notes_violin", width=width, height=height)
fig
fig = plotting.make_box_plot(
    weighted_pitch_values,
    x_col="dataset",
    y_col="value",
    color="dataset",
    facet_row="distribution",
    # box=True,
    labels=dict(dataset="", tpc="distribution of tonal pitch classes by duration"),
    category_orders=dict(dataset=chronological_corpus_names),
    # color_discrete_map=corpus_name_colors,
    color_discrete_sequence=px.colors.qualitative.Light24,
    # traces_settings=dict(spanmode='hard'),
    layout=dict(showlegend=False, margin=dict(t=0)),
    x_axis=dict(tickangle=45, tickfont_size=15),
    y_axis=dict(
        tickmode="array",
        tickvals=[-12, -9, -6, -3, 0, 3, 6, 9, 12, 15, 24, 36, 48, 60, 72, 84, 96],
        ticktext=[
            "Dbb",
            "Bbb",
            "Gb",
            "Eb",
            "C",
            "A",
            "F#",
            "D#",
            "B#",
            "G##",
            "C1",
            "C2",
            "C3",
            "C4",
            "C5",
            "C6",
            "C7",
        ],
        zerolinecolor="grey",
        zeroline=True,
    ),
    width=width,
    height=height,
)
utils.realign_subplot_axes(fig, y_axes=True)
save_figure_as(fig, "notes_box", width=width, height=height)
fig

As bar plots#

bar_data = all_notes.groupby("tpc").duration_qb.sum().reset_index()
x_values = list(range(bar_data.tpc.min(), bar_data.tpc.max() + 1))
x_names = ms3.fifths2name(x_values)
fig = px.bar(
    bar_data,
    x="tpc",
    y="duration_qb",
    labels=dict(tpc="Named pitch class", duration_qb="Duration in quarter notes"),
    color_discrete_sequence=utils.CORPUS_COLOR_SCALE,
    width=1000,
    height=300,
)
fig.update_layout(**utils.STD_LAYOUT)
fig.update_xaxes(
    zerolinecolor="grey",
    tickmode="array",
    tickvals=x_values,
    ticktext=x_names,
    dtick=1,
    ticks="outside",
    tickcolor="black",
    minor=dict(dtick=6, gridcolor="grey", showgrid=True),
)
save_figure_as(fig, "pitch_class_distribution_absolute_bars")
fig.show()
scatter_data = all_notes.groupby(["corpus_name", "tpc"]).duration_qb.sum().reset_index()
fig = px.bar(
    scatter_data,
    x="tpc",
    y="duration_qb",
    color="corpus_name",
    labels=dict(
        duration_qb="duration",
        tpc="named pitch class",
    ),
    category_orders=dict(dataset=chronological_corpus_names),
    color_discrete_map=corpus_name_colors,
    width=1000,
    height=500,
)
fig.update_layout(**utils.STD_LAYOUT)
fig.update_xaxes(
    zerolinecolor="grey",
    tickmode="array",
    tickvals=x_values,
    ticktext=x_names,
    dtick=1,
    ticks="outside",
    tickcolor="black",
    minor=dict(dtick=6, gridcolor="grey", showgrid=True),
)
save_figure_as(fig, "pitch_class_distribution_corpuswise_absolute_bars")
fig.show()

As scatter plots#

fig = px.scatter(
    scatter_data,
    x="tpc",
    y="duration_qb",
    color="corpus_name",
    labels=dict(
        duration_qb="duration",
        tpc="named pitch class",
    ),
    category_orders=dict(dataset=chronological_corpus_names),
    color_discrete_map=corpus_name_colors,
    facet_col="corpus_name",
    facet_col_wrap=3,
    facet_col_spacing=0.03,
    width=1000,
    height=1000,
)
fig.update_traces(mode="lines+markers")
fig.for_each_annotation(lambda a: a.update(text=a.text.split("=")[-1]))
fig.update_layout(**utils.STD_LAYOUT, showlegend=False)
fig.update_xaxes(
    zerolinecolor="grey",
    tickmode="array",
    tickvals=[-12, -6, 0, 6, 12, 18],
    ticktext=["Dbb", "Gb", "C", "F#", "B#", "E##"],
    visible=True,
)
fig.update_yaxes(zeroline=False, matches=None, showticklabels=True)
save_figure_as(fig, "pitch_class_distribution_corpuswise_scatter")
fig.show()
no_accidental = bar_data[bar_data.tpc.between(-1, 5)].duration_qb.sum()
with_accidental = bar_data[~bar_data.tpc.between(-1, 5)].duration_qb.sum()
entire = no_accidental + with_accidental
(
    f"Fraction of note duration without accidental of the entire durations: {no_accidental} / {entire} = "
    f"{no_accidental / entire}"
)
'Fraction of note duration without accidental of the entire durations: 2958.15 / 5940.2 = 0.49798828322278715'

Notes and staves#

print("Distribution of notes over staves:")
utils.value_count_df(all_notes.staff)
Distribution of notes over staves:
counts %
staff
2 5073 48.69
3 4177 40.09
1 1168 11.21